package com.engine.cn.sigletom;

/**
 * 单例模式(Singleton Pattern)是一种常用的设计模式，它确保一个类只有一个实例，并提供一个全局访问点。
 */
public class UnsafeLazySingleton {
    //加上volatile关键字限制指令重排序；
    // 指令重排序就是   result = new UnsafeLazySingleton();这条命令，1-new开辟内存空间；2-初始化对象；3-把实例对象赋值给result引用。这三个指令并不是原子的（可以重排序乱序）。
    // 在多线程情况下，导致其他线程拿到这样一个不完整的这么一个对象。
    private static volatile UnsafeLazySingleton instance;

    //这里不允许创建
    private UnsafeLazySingleton() {
        if (instance != null) {
            throw new IllegalStateException("已经实例化");
        }
    }

    public static UnsafeLazySingleton getInstance() {
        if (instance == null) {
            //模拟实例创建的调用
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            synchronized (UnsafeLazySingleton.class) {
                //第二次判空的理由是：线程A和线程B同时进入 instance==null，如果没有第二次判空，就会重建两个对象。
                if (instance == null) {
                    instance = new UnsafeLazySingleton();
                }
            }
        }

        return instance;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                UnsafeLazySingleton singleton = UnsafeLazySingleton.getInstance();
                System.out.println("线程编号==>" + singleton);
            }
            ).start();
        }
    }
}
